Linux系统安全强化指南
责编:Linux妹 | 来源:gaochao 译
blog.gaochao.me/post/645734976535543808/linux系统安全强化指南
大家好,我是Linux妹。
本指南仅关注安全性和隐私性,而不关注性能,可用性或其他内容。列出的所有命令都将需要root特权。以“$”符号开头的单词表示一个变量,不同终端之间可能会有所不同。
避免分发冻结程序包,因为它们在安全更新中通常很落后。
不使用与Systemd机制的发行版。Systemd包含许多不必要的攻击面;它尝试做的事情远远超出了必要,并且超出了初始化系统应做的事情。
使用musl作为默认的C库。Musl专注于最小化,这会导致很小的攻击面,而其他C库(例如glibc)过于复杂,容易产生漏洞。例如,与musl中的极少数漏洞相比,glibc中的一百多个漏洞已被公开披露。尽管仅靠披露的CVE本身通常是不准确的统计信息,但有时这种情况有时可以用来表示过分的问题。Musl还具有不错的漏洞利用缓解措施,尤其是其新的强化内存分配器。
最好默认情况下使用LibreSSL而不是OpenSSL的发行版。OpenSSL包含大量完全不必要的攻击面,并且遵循不良的安全做法。例如,它仍然保持OS / 2和VMS支持这些已有数十年历史的古老操作系统。这些令人讨厌的安全做法导致了可怕的Heartbleed漏洞。LibreSSL是OpenBSD团队的OpenSSL分支,它采用了出色的编程实践并消除了很多攻击面。在LibreSSL成立的第一年内,它缓解了许多漏洞,其中包括一些高严重性的漏洞。
用作强化操作系统基础的最佳发行版是Gentoo Linux,因为它可以让您精确地配置系统,以达到理想的效果,这将非常有用,尤其是参考我们在后面的章节中使用更安全的编译标志。
但是,由于Gentoo的巨大可用性缺陷,它对于许多人来说可能并不顺手。在这种情况下,Void Linux的Musl构建是一个很好的折衷方案。
Stable vs LTS内核
Linux内核以两种主要形式发布:稳定和长期支持(LTS)。稳定版本是较新的版本,而LTS发行版本是较老的稳定版本,长期以来一直受支持。选择上述任何一个发行版本都有许多后果。
Linux内核未使用CVE标识安全漏洞。这意味着大多数安全漏洞的修复程序不能向后移植到LTS内核。但是稳定版本包含到目前为止进行的所有安全修复。
但是,有了这些修复程序,稳定的内核将包含更多新功能,因此大大增加了内核的攻击面,并引入了大量新错误。相反,LTS内核的受攻击面较小,因为这些功能没有被不断添加。
此外,稳定的内核还包括更新的强化功能,以减轻LTS内核没有的某些利用。此类功能的一些示例是Lockdown LSM和STACKLEAK GCC插件。
总而言之,在选择稳定或LTS内核时需要权衡取舍。LTS内核具有较少的强化功能,并且并非当时所有的公共错误修复都已向后移植,但是通常它的攻击面更少,并且引入未知错误的可能性也较小。稳定的内核具有更多的强化功能,并且包括所有已知的错误修复,但它也具有更多的攻击面以及引入更多未知错误的机会更大。最后,最好使用较新的LTS分支(如4.19内核)。
Sysctl
Sysctl是允许用户配置某些内核设置并启用各种安全功能或禁用危险功能以减少攻击面的工具。要临时更改设置,您可以执行:
sysctl -w $tunable = $value
以下是您应更改的建议sysctl设置。
Kernel self-protection
kernel.kptr_restrict=2
kernel.dmesg_restrict=1
kernel.printk=3 3 3 3
kernel.unprivileged_bpf_disabled=1
net.core.bpf_jit_harden=2
dev.tty.ldisc_autoload=0
vm.unprivileged_userfaultfd=0
kernel.kexec_load_disabled=1
kernel.sysrq=4
kernel.unprivileged_userns_clone=0
请注意,尽管该sysctl仅在某些Linux发行版中存在,因为它需要内核补丁。如果您的内核不包含此补丁,则可以通过设置user.max_user_namespaces = 0来完全禁用用户名称空间(包括root用户)。
kernel.perf_event_paranoid=3
请注意,此sysctl设置需要在某些发行版中具备相关的内核补丁。否则,此设置等效于kernel.perf_event_paranoid = 2,它仅限制此功能的子集。
网络
net.ipv4.tcp_rfc1337=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.default.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.accept_source_route=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.accept_ra=0
net.ipv4.tcp_sack=0
net.ipv4.tcp_dsack=0
net.ipv4.tcp_fack=0
用户空间
kernel.yama.ptrace_scope=2
vm.mmap_rnd_bits=32
vm.mmap_rnd_compat_bits=16
这些sysctls的值必须根据CPU体系结构进行设置。以上值与x86兼容,但其他体系结构可能有所不同。
fs.protected_symlinks=1
fs.protected_hardlinks=1
fs.protected_fifos=2
fs.protected_regular=2
引导参数
引导参数在引导时使用引导加载程序(bootloader)将设置传递给内核。类似于sysctl,可以使用某些设置来提高安全性。引导加载程序通常在引导参数设置方式上有所不同。下面列出了一些示例,但是您应该研究特定bootloader的修改参数的必要步骤。
如果使用GRUB作为引导程序,请编辑/etc /default/grub并将参数添加到GRUB_CMDLINE_LINUX_DEFAULT=line。
如果使用Syslinux,请编辑/boot/syslinux/syslinux.cfg并将它们添加到APPEND行中。
如果使用systemd-boot,请编辑您的加载程序条目,并将其附加到linux行的末尾。
建议使用以下设置以提高安全性。
Kernel self-protection
slab_nomerge
slub_debug=FZ
init_on_alloc=1 init_on_free=1
page_alloc.shuffle=1
pti=on
vsyscall=none
debugfs=off
oops=panic
module.sig_enforce=1
这可以防止加载所有树外内核模块(包括DKMS模块),除非您已对其进行签名,这意味着诸如VirtualBox或Nvidia驱动程序之类的模块可能不可用,但根据您的设置可能并不重要。
lockdown=confidentiality
mce=0
quiet loglevel=0
CPU缓解
最好启用适用于您的CPU的所有CPU缓解措施,以确保您不受已知漏洞的影响。这是启用所有内置缓解措施的列表:
spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force
结果
如果遵循了以上所有建议(不包括特定的CPU缓解措施),则将具有:
slab_nomerge slub_debug=FZ init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic module.sig_enforce=1 lockdown=confidentiality mce=0 quiet loglevel=0
hidepid
/proc是一个伪文件系统,其中包含有关系统上当前正在运行的所有进程的信息。默认情况下,所有用户都可以访问此程序,这可能使攻击者可以窥探其他进程。要只允许用户看到自己的进程,而不能看到其他用户的进程,则必须使用hidepid=2,gid=proc挂载选项来挂载/proc。gid=proc将proc组从此功能中排除,因此您可以将特定的用户或进程列入白名单。添加这些选项的一种方法是编辑/etc/fstab并添加:
proc /proc proc nosuid,nodev,noexec,hidepid=2,gid=proc 0 0
[Service]
SupplementaryGroups=proc
减少内核攻击面
最好禁用不是绝对必要的任何功能,以最大程度地减少潜在的内核攻击面。这些功能不必一定很危险,它们可以只是被删除以减少攻击面的良性代码。切勿禁用您不了解的随机事物。以下是一些可能有用的示例,具体取决于您的设置。
引导参数
引导参数通常可以用来减少攻击面,这样的例子之一是:
ipv6.disable=1
将内核模块列入黑名单
内核允许非特权的用户通过模块自动加载来间接导致某些模块被加载。这使攻击者可以自动加载易受攻击的模块,然后加以利用。一个这样的示例是CVE-2017-6074,其中攻击者可以通过启动DCCP连接来触发DCCP内核模块的加载,然后利用该内核模块中的漏洞。
可以通过将文件插入/etc/modprobe.d并将指定的内核模块列入黑名单的方法,将特定的内核模块列入黑名单。
Install参数告诉modprobe运行特定命令,而不是像往常一样加载模块。/bin/false是仅返回1的命令,该命令实际上不会执行任何操作。两者都告诉内核运行/bin/false 而不是加载模块,这将防止攻击者利用该模块。以下是最有可能不需要的内核模块:
install sctp /bin/false
install rds /bin/false
install tipc /bin/false
install n-hdlc /bin/false
install ax25 /bin/false
install netrom /bin/false
install x25 /bin/false
install rose /bin/false
install decnet /bin/false
install econet /bin/false
install af_802154 /bin/false
install ipx /bin/false
install appletalk /bin/false
install psnap /bin/false
install p8023 /bin/false
install p8022 /bin/false
install can /bin/false
install atm /bin/false
DCCP — Datagram Congestion Control Protocol
SCTP — Stream Control Transmission Protocol
RDS — Reliable Datagram Sockets
TIPC — Transparent Inter-process Communication
HDLC — High-Level Data Link Control
AX25 — Amateur X.25
NetRom
X25
ROSE
DECnet
Econet
af_802154 — IEEE 802.15.4
IPX — Internetwork Packet Exchange
AppleTalk
PSNAP — Subnetwork Access Protocol
p8023 — Novell raw IEEE 802.3
p8022 — IEEE 802.2
CAN — Controller Area Network
ATM
install cramfs /bin/false
install freevxfs /bin/false
install jffs2 /bin/false
install hfs /bin/false
install hfsplus /bin/false
install squashfs /bin/false
install udf /bin/false
install cifs /bin/true
install nfs /bin/true
install nfsv3 /bin/true
install nfsv4 /bin/true
install gfs2 /bin/true
install vivid /bin/false
install bluetooth /bin/false
install btusb /bin/false
install uvcvideo /bin/false
您也可以将麦克风模块列入黑名单,但这在系统之间可能会有所不同。要查找模块的名称,请在/proc/asound/modules中查找并将其列入黑名单。例如,一个这样的模块是snd_hda_intel。
搜索公众号顶级算法后台回复“算法”,获取一份惊喜礼包。
请注意,尽管有时麦克风的内核模块与扬声器的模块相同。这意味着像这样禁用麦克风也可能会无意中禁用任何扬声器,虽然扬声器也有可能变成麦克风,所以这不一定是消极的结果。
最好从物理上删除这些设备,或者至少在BIOS/UEFI中禁用它们。禁用内核模块并不总是那么有效。
rfkill
可以通过rfkill将无线设备列入黑名单,以进一步减少远程攻击面。要将所有无线设备列入黑名单,请执行:
rfkill block all
rfkill unblock wifi
其他内核指针泄漏
前面的部分已经防止了一些内核指针泄漏,但是还有更多泄漏。
在文件系统上,/boot中存在内核映像和System.map文件。/usr/src和/{,usr/} lib/modules目录中还有其他敏感的内核信息。您应该限制这些目录的文件权限,以使它们只能由root用户读取。您还应该删除System.map文件,因为除高级调试外,它们都不需要。
此外,某些日志记录守护程序(例如systemd的journalctl)包括内核日志,可用于绕过上述dmesg_restrict保护。从adm组中删除用户通常足以撤销对以下日志的访问:
gpasswd -d $user adm
限制对sysfs的访问
sysfs是伪文件系统,可提供大量的内核和硬件信息。它通常安装在/sys上。sysfs导致大量信息泄漏,尤其是内核指针泄漏。Whonix的security-misc软件包包括hide-hardware-info脚本,该脚本限制访问此目录以及/proc中的一些脚本,以试图隐藏潜在的硬件标识符并防止内核指针泄漏。该脚本是可配置的,并允许基于组将特定的应用程序列入白名单。建议应用此方法,并使其在启动时使用init脚本执行。或者这样做成systemd服务[1]。
为了使基本功能在使用systemd的系统上运行,必须将一些系统服务列入白名单。这可以通过创建/etc/systemd/system/user@.service.d/sysfs.conf并添加以下内容来完成:
[Service]
SupplementaryGroups=sysfs}
Linux强化
某些发行版(例如Arch Linux)包括强化的内核程序包。它包含许多强化补丁程序和更注重安全性的内核配置。如果可能的话,建议安装它。
Grsecurity
Grsecurity是一组内核修补程序,可以大大提高内核安全性。这些补丁曾经可以免费获得,但是现在需要购买了。如果可用,则强烈建议您获取它。Grsecurity提供了最新的内核和用户空间保护。
内核运行时防护
Linux Kernel Runtime Guard(LKRG)是一个内核模块,可确保运行时内核的完整性并检测漏洞。它可以杀死整个类别的内核漏洞。但这并不是一个完美的缓解方法,因为LKRG在设计上可以绕开。它仅适用于现成的恶意软件。但是,尽管可能性不大,但LKRG本身可能会像其他任何内核模块一样公开新的漏洞。
自编译内核
建议编译您自己的内核,同时启用尽可能少的内核模块和尽可能多的安全性功能,以将内核的受攻击面保持在绝对最低限度。
另外,应用内核强化补丁,例如如上所述的linux-hardened或grsecurity。
发行版编译的内核还具有公共内核指针/符号,这对于漏洞利用非常有用。编译自己的内核将为您提供独特的内核符号,连同kptr_restrict,dmesg_restrict和其他针对内核指针泄漏的强化措施,将使攻击者更加难以创建依赖于内核指针知识的漏洞利用程序。
您就可以从Whonix的强化内核中汲取灵感或使用它。
最常用的MAC措施是SELinux和AppArmor。SELinux比AppArmor更安全,因为它的粒度更细。例如,它是基于inode而不是基于路径的,允许强制执行明显更严格的限制,可以过滤内核ioctl等。不幸的是,这是以难以使用和难以学习为代价的,因此某些人可能会首选AppArmor。
要在内核中启用AppArmor,必须设置以下引导参数:
apparmor=1 security=apparmor
selinux=1 security=selinux
aa-genprof $path_to_program
如果您想更进一步,则可以通过实施initramfs勾子来设置一个完整的系统MAC策略,该策略限制每个单个用户空间进程,该挂钩对init系统强制实施MAC策略。这就是Android使用SELinux的方式,以及Whonix未来将如何使用AppArmor的方式。对于加强实施最小特权原则的强大安全模型是必要的。
沙箱可让您在隔离的环境中运行程序,该环境对系统的其余部分具有有限的访问权限或完全没有访问权限。您可以使用它们来保护应用程序安全或运行不受信任的程序。
建议与AppArmor或SELinux一起在单独的用户帐户中使用Bubblewrap到沙箱程序。您也可以考虑改用gVisor,它的优点是为每个来宾提供了自己的内核。这些方法中的任何一个都可以用来创建一个功能强大的沙箱,并且暴露的攻击面最小。如果您不想自己创建沙箱,请在完成后考虑使用Whonix的sandbox-app-launcher。您不应该使用Firejail。
诸如Docker和LXC之类的容器解决方案经常被误导为沙盒形式。它们太宽松了,无法广泛支持各种应用程序,因此不能认为它们是强大的应用程序沙箱。
常见沙箱逃逸
PulseAudio
PulseAudio是一种常见的声音服务器,但在编写时并未考虑隔离或沙盒的问题,这使其成为重复出现的沙盒逃逸漏洞。为了防止这种情况,建议您从沙箱中阻止对PulseAudio的访问,或者从系统中完全卸载它。
D-Bus
D-Bus是台式机Linux上最流行的进程间通信形式,但它也是沙箱逃逸的另一种常见途径,因为它允许与服务自由交互。这些漏洞的一个例子就是Firejail。您应该从沙箱中阻止对D-Bus的访问,或者通过MAC以细粒度的规则进行调解。
GUI隔离
任何Xorg窗口都可以访问另一个窗口。这允许琐碎的键盘记录或屏幕截图程序,甚至可以记录诸如root密码之类的内容。您可以使用嵌套的X11服务器(例如Xpra或Xephyr和bubblewrap)将Xorg窗口沙箱化。默认情况下,Wayland将窗口彼此隔离,这将是一个比Xorg更好的选择,尽管Wayland可能不如Xorg普遍可用,因为它在开发中较早。
ptrace
如前所述,ptrace是一个系统调用,可能会被滥用破坏在沙箱外部运行的进程。为避免这种情况,您可以通过sysctl启用内核YAMA ptrace限制,也可以在seccomp过滤器中将ptrace syscall列入黑名单。
TIOCSTI
TIOCSTI是一个ioctl,它允许注入终端命令,并为攻击者提供了一种简单的机制,可以在同一用户会话内的其他进程之间横向移动。可以通过将seccomp过滤器中的ioctl列入黑名单或使用bubblewrap的--new-session参数来缓解这种攻击。
Systemd沙箱
虽然不建议使用systemd,但有些系统可能无法切换。这些人至少可以使用沙盒服务,因此他们只能访问所需的内容。这是一个沙箱化systemd服务的示例:
[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
ProtectKernelLogs=true
ProtectHostname=true
ProtectClock=true
ProtectProc=invisible
ProcSubset=pid
PrivateTmp=true
PrivateUsers=yes
PrivateDevices=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true
LockPersonality=true
RestrictRealtime=true
RestrictSUIDSGID=true
RestrictAddressFamilies=AF_INET
RestrictNamespaces=yes
SystemCallFilter=write read openat close brk fstat lseek mmap mprotect munmap rt_sigaction rt_sigprocmask ioctl nanosleep select access execve getuid arch_prctl set_tid_address set_robust_list prlimit64 pread64 getrandom
SystemCallArchitectures=native
UMask=0077
IPAddressDeny=any
AppArmorProfile=/etc/apparmor.d/usr.bin.example
CapabilityBoundingSet=— Specifies the capabilities the process is given.
ProtectHome=true— Makes all home directories inaccessible.
ProtectKernelTunables=true— Mounts kernel tunables such as those modified throughsysctlas read-only.
ProtectKernelModules=true— Denies module loading and unloading.
ProtectControlGroups=true— Mounts all control group hierarchies as read-only.
ProtectKernelLogs=true— Prevents accessing the kernel logs.
ProtectHostname=true— Prevents changes to the system hostname.
ProtectClock— Prevents changes to the system clock.
ProtectProc=invisible— Hides all outside processes.
ProcSubset=pid— Permits access to only the pid subset of/proc.
PrivateTmp=true— Mounts an empty tmpfs over/tmpand/var/tmp, therefore hiding their previous contents.
PrivateUsers=true— Sets up an empty user namespace to hide other user accounts on the system.
PrivateDevices=true— Creates a new/devmount with minimal devices present.
MemoryDenyWriteExecute=true— Enforces a memory W^X policy.
NoNewPrivileges=true— Prevents escalating privileges.
LockPersonality=true— Locks down thepersonality()syscall to prevent switching execution domains.
RestrictRealtime=true— Prevents attempts to enable realtime scheduling.
RestrictSUIDSGID=true— Prevents executing setuid or setgid binaries.
RestrictAddressFamilies=AF_INET— Restricts the usable socket address families to IPv4 only (AF_INET).
RestrictNamespaces=true— Prevents creating any new namespaces.
SystemCallFilter=...— Restricts the allowed syscalls to the absolute minimum. If you aren't willing to maintain your own custom seccomp filter, then systemd provides many predefined system call sets that you can use.@system-servicewill be suitable for many use cases.
SystemCallArchitectures=native— Prevents executing syscalls from other CPU architectures.
UMask=0077— Sets the umask to a more restrictive value.
IPAddressDeny=any— Blocks all incoming and outgoing traffic to/from any IP address. SetIPAddressAllow=to configure a whitelist. Alternatively, setup a network namespace withPrivateNetwork=true.
AppArmorProfile=...— Runs the process under the specified AppArmor profile.
如果您使用的系统不是systemd而是init,那么可以使用bubblewrap轻松复制所有这些选项。
gVisor
普通沙箱固有地与主机共享同一内核。您信任我们已经评估为不安全的内核,可以正确限制这些程序。由于主机内核的整个攻击面已完全暴露,因此沙盒中的内核利用程序可以绕过任何限制。已经进行了一些努力来限制使用seccomp的攻击面,但不足以完全解决此问题。
GVisor是解决此问题的方法。它为每个应用程序提供了自己的内核,该内核以内存安全的语言重新实现了Linux内核的大部分系统调用,从而提供了明显更强的隔离性。
虚拟机
虽然不是传统的“沙盒”,但虚拟机通过虚拟化全新系统来分离进程,从而提供了非常强大的隔离性。KVM是内核模块,它允许内核充当管理程序,而QEMU是利用KVM的仿真器。Virt-manager和GNOME Boxs都是良好且易于使用的GUI,用于管理KVM / QEMU虚拟机。不建议使用Virtualbox的原因有很多。
可以通过LD_PRELOAD环境变量针对每个应用程序使用hardened_malloc。例如,假设您编译的库位于/usr/lib/libhardened_malloc.so,则可以执行:
LD_PRELOAD="/usr/lib/libhardened_malloc.so" $program
/usr/lib/libhardened_malloc.so
CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH=0 CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH=0 CONFIG_GUARD_SLABS_INTERVAL=8
vm.max_map_count=524240
某些编译选项可用于添加其他漏洞利用缓解措施,从而消除整个类别的常见漏洞。您可能听说过常规保护,例如位置独立可执行文件,堆栈粉碎保护程序,立即绑定,只读重定位和FORTIFY_SOURCE,但是本节将不做介绍,因为它们已被广泛采用。相反,它将讨论诸如控制流完整性和影子堆栈之类的现代漏洞利用缓解措施。
本节涉及主要用C或C ++编写的本机程序。您必须使用Clang编译器,因为这些功能在GCC上不可用。请记住,由于未广泛采用这些缓解措施,因此某些应用程序在启用它们后可能无法运行。
控制流完整性(CFI)是一种缓解漏洞利用的方法,旨在防止诸如ROP或JOP之类的代码重用攻击。由于更广泛采用的缓解措施(例如NX)使过时的利用技术过时了,因此使用这些技术利用了很大一部分漏洞。Clang支持细粒度的前沿CFI,这意味着它可以有效缓解JOP攻击。Clang的CFI本身并不能减轻ROP;您还必须使用下面记录的单独机制。要启用此功能,必须应用以下编译标志:
-flto -fvisibility=hidden -fsanitize=cfi
-fsanitize=shadow-call-stack
-fsanitize=safe-stack
-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
/etc/securetty
/etc/securetty文件指定允许您以root用户身份登录的位置。该文件应保留为空,以便任何人都不能从终端上这样做。
限制su
su可让您从终端切换用户。默认情况下,它尝试以root用户身份登录。要将su的使用限制在wheel组中,请编辑/etc/pam.d/su和/etc/pam.d/su-l并添加:
auth required pam_wheel.so use_uid
锁定root账户
要锁定root帐户以防止任何人以root身份登录,请执行:
passwd -l root
拒绝通过SSH的远程root登陆
为了防止某人通过SSH以root身份登录,请编辑/etc/ssh/sshd_config并添加:
PermitRootLogin no
增加散列回合数
您可以增加shadow使用的哈希回合数,从而通过迫使攻击者计算更多的哈希值来破解您的密码,从而提高哈希密码的安全性。默认情况下,shadow使用5000次回合,但是您可以将其增加到任意数量。尽管配置的回合越多,登录速度就越慢。编辑/etc/pam.d/passwd并添加回合选项。
password required pam_unix.so sha512 shadow nullok rounds=65536
应用此设置后,密码不会自动重新加密,因此您需要使用以下方法重置密码:
passwd $username
限制Xorg root访问
默认情况下,某些发行版以root用户身份运行Xorg,这是一个问题,因为Xorg包含大量古老而又复杂的代码,这增加了巨大的攻击面,并使其更有可能拥有可以获取root特权的漏洞利用程序。要阻止它作为root用户执行,请编辑/etc/X11/Xwrapper.config并添加:
needs_root_rights = no
安全访问root
恶意软件可以使用多种方法来嗅探root帐户的密码。因此,访问根帐户的传统方式是不安全的,最好根本不访问根,但这实际上是不可行的。本节详细介绍了访问根帐户的最安全方法。在安装操作系统后,应立即应用这些说明,以确保该软件不含恶意软件。
您绝对不能使用普通用户帐户访问root,因为root可能已被盗用。您也不能直接登录到根帐户。通过执行以下操作,创建一个单独的“管理员”用户帐户,该帐户仅用于访问root用户,而不能用于访问其他用户:
useradd admin
passwd admin
visudo -f /etc/sudoers.d/admin-account
admin ALL=(ALL) ALL
确保没有其他帐户可以访问sudo(或您的首选机制)。
现在,要实际登录到该帐户,请先重新启动-例如,这可以防止受损的窗口管理器执行登录欺骗。当提供登录提示时,请通过按键盘上的以下组合键来激活安全注意键:
Alt + SysRq + k
这是基本iptables配置的示例,该配置禁止所有传入的网络流量:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
主机名和用户名
请勿在主机名或用户名中添加唯一标识的内容。将它们保留为通用名称,例如“host”和“user”,以便它们无法识别您。
Timezones / Locales / Keymaps
如果可能,应将您的时区设置为“ UTC”,将区域设置和键盘映射设置为“ US”。
机器ID
一个独一无二的机器ID被存储在/var/lib/dbus/machine-id (systemd系统是保存在/etc/machine-id)这些应编辑为通用名称,例如Whonix ID:
b08dfa6083e7567a1921a715000001fb
MAC地址欺骗
MAC地址是分配给网络接口控制器(NIC)的唯一标识符。每次您连接到网络时(WIFI或以太网)则您的MAC地址已暴露。这使人们可以使用它来跟踪您并在本地网络上唯一地标识您。
搜索公众号Linux就该这样学后台回复“权限系统”,获取一份惊喜礼包。
但您不应该完全随机化MAC地址。拥有完全随机的MAC地址是显而易见的,并且会对您脱颖而出的行为产生不利影响。
MAC地址的OUI(组织唯一标识符)部分标识芯片组的制造商。对MAC地址的这一部分进行随机化处理可能会为您提供以前从未使用过的OUI,数十年来从未使用过的OUI或在您所在的地区极为罕见的OUI,因此使您脱颖而出,很明显地表明您在欺骗MAC地址。
MAC地址的末尾标识您的特定设备,并且可以用来跟踪您的设备。仅对MAC地址的这一部分进行随机化可防止您被跟踪,同时仍使MAC地址看起来可信。
要欺骗这些地址,请首先执行以下命令找出您的网络接口名称:
ip a
macchanger -e $network_interface
[Unit]
Description=macchanger on eth0
Wants=network-pre.target
Before=network-pre.target
BindsTo=sys-subsystem-net-devices-eth0.device
After=sys-subsystem-net-devices-eth0.device
[Service]
ExecStart=/usr/bin/macchanger -e eth0
Type=oneshot
[Install]
WantedBy=multi-user.target
时间攻击
几乎每个系统都有不同的时间。这可用于时钟偏斜指纹攻击,几毫秒的差异足以使用户被暴露识别。
ICMP时间戳
ICMP时间戳会在查询答复中泄漏系统时间。阻止这些攻击的最简单方法是利用防火墙阻止传入连接,或者使内核忽略ICMP请求。
TCP时间戳
TCP时间戳也会泄漏系统时间。内核尝试通过对每个连接使用随机偏移量来解决此问题,但这不足以解决问题。因此应该禁用TCP时间戳,可以通过使用sysctl设置以下内容来完成:
net.ipv4.tcp_timestamps=0
TCP初始化序号
TCP初始序列号(ISN)是泄漏系统时间的另一种方法。为了减轻这种情况,您必须安装tirdad内核模块,该模块会生成用于连接的随机ISN。
时间同步
时间同步对于匿名性和安全性至关重要。错误的系统时钟可能使您遭受时钟偏斜指纹攻击,或者可以用来为您提供过时的HTTPS证书,从而绕过证书到期或吊销。
最流行的时间同步方法NTP是不安全的,因为它未经加密和未经身份验证,因此攻击者可以轻易地拦截和修改请求。NTP还会以NTP时间戳格式泄漏本地系统时间,该格式可用于时钟偏斜指纹识别,如前所述。
因此,您应该卸载所有NTP客户端并禁用systemd-timesyncd(如果正在使用)。您可以通过安全连接(HTTPS或最好是Torion服务)连接到受信任的网站,而不是NTP,并从HTTP标头中提取当前时间。达到此目的的工具是sdwdate或我自己的安全时间同步工具。
按键指纹
可以通过他们在键盘上输入键的方式来对人进行指纹识别。您可以通过键入速度,在两次按键之间的暂停,每次按键被按下和释放的确切时间等方式来唯一地进行指纹识别。可以使用KeyTrac在线进行测试。
Kloak是一种工具,旨在通过混淆按键和释放事件之间的时间间隔来克服这种跟踪方法。当按键被按下时,它会引入随机延迟,然后由应用程序选择。
这可以通过执行以下操作来限制:
chmod 700 /home/$user
chmod 700 /boot /usr/src /lib/modules /usr/lib/modules
Whonix的SUID Disabler和Permission Hardener会自动应用本节中详细介绍的步骤。
setuid / setgid
Setuid / SUID允许用户使用二进制文件所有者的特权执行二进制文件。这通常用于允许非特权用户使用通常仅为root用户保留的某些功能。因此,许多SUID二进制文件都有特权升级安全漏洞的历史记录。Setgid / SGID类似,但适用于组而不是用户。要使用setuid或setgid位查找系统上的所有二进制文件,请执行:
find / -type f \( -perm -4000 -o -perm -2000 \)
chmod u-s $path_to_program
chmod g-s $path_to_program
setcap $capability+ep $path_to_program
setcap -r $path_to_program
umask
umask设置新创建文件的默认文件权限。默认的umask是0022,它不是很安全,因为它为系统上的每个用户提供了对新创建文件的读取访问权限。要使所有者以外的任何人都不可读新文件,请编辑/etc/profile并添加:
umask 0077
禁用它们的方法主要有三种:sysctl,systemd和ulimit。
sysctl
通过sysctl设置以下设置:
kernel.core_pattern=|/bin/false
systemd
创建/etc/systemd/coredump.conf.d/disable.conf并添加如下内容:
[Coredump]
Storage=none
ulimit
编辑/etc/security/limits.conf并添加如下内容:
* hard core 0
setuid进程
即使在进行了这些设置之后,以提升的特权运行的进程仍可能会转储其内存。
为了防止他们这样做,请通过sysctl设置以下内容:
fs.suid_dumpable=0
vm.swappiness=1
要强制使用强密码,可以使用pam_pwquality。它强制执行密码的可配置策略。例如,如果您希望密码至少包含16个字符(最小),与旧密码(difok)至少6个不同的字符,至少3个数字(dcredit),至少2个大写字母(ucredit),至少2个字符小写字母(lcredit)和至少3个其他字符(ocredit),然后编辑/etc/pam.d/passwd并添加:
password required pam_pwquality.so retry=2 minlen=16 difok=6 dcredit=-3 ucredit=-2 lcredit=-2 ocredit=-3 enforce_for_root
password required pam_unix.so use_authtok sha512 shadow
auth optional pam_faildelay.so delay=4000000
要启用这些功能,请通过sysctl设置以下设置:
net.ipv6.conf.all.use_tempaddr=2
net.ipv6.conf.default.use_tempaddr=2
NetworkManager
要为NetworkManager启用隐私扩展,请编辑/etc/NetworkManager/NetworkManager.conf并添加:
[connection]
ipv6.ip6-privacy=2
systemd-networkd
要为systemd-networkd启用隐私扩展,请创建/etc/systemd/network/ipv6-privacy.conf并添加:
[Network]
IPv6PrivacyExtensions=kernel
分区和挂载选项
文件系统应分为多个分区,以对其权限进行细粒度控制。可以添加不同的安装选项以限制可以执行的操作:
nodev - 禁止使用设备
nosuid - 禁止setuid或setgid位
noexec - 禁止执行任何二进制文件
/ / ext4 defaults 1 1
/home /home ext4 defaults,nosuid,noexec,nodev 1 2
/tmp /tmp ext4 defaults,bind,nosuid,noexec,nodev 1 2
/var /var ext4 defaults,bind,nosuid 1 2
/boot /boot ext4 defaults,nosuid,noexec,nodev 1 2
为了使jitterentropy正确运行,必须通过创建/usr/lib/modules-load.d/jitterentropy.conf并添加以下内容尽早加载内核模块:
jitterentropy_rng
RDRAND
RDRAN是提供随机数的CPU指令。如果可用,内核会自动将其用作熵源。但是由于它是专有的并且是CPU本身的一部分,因此无法审核和验证其安全性。您甚至无法对代码进行反向工程。该RNG以前曾遭受过漏洞的攻击,其中有些可能是后门攻击。通过设置以下引导参数可以不信任此功能:
random.trust_cpu=off
解决方案是使用sudoedit。这会将文件复制到一个临时位置,以普通用户身份打开文本编辑器,编辑该临时文件并以root用户身份覆盖原始文件。这样,实际的编辑器就不会以root身份运行。要使用sudoedit,执行:
sudoedit $path_to_file
EDITOR=nano sudoedit $path_to_file
默认情况下,Linux发行版通常使用HTTP或HTTP和HTTPS镜像的混合来从其软件存储库下载软件包。人们认为这很好,因为程序包管理器会在安装前验证程序包的签名。但是,从历史上看,已经有很多绕过此方法的地方。您应将软件包管理器配置为从HTTPS镜像专门下载以进行深度防御。
APT seccomp-bpf
自软件包管理器Debian Buster以来,APT已支持可选的seccomp-bpf过滤。这限制了允许执行APT的系统调用,这可能严重限制攻击者尝试利用APT中的漏洞时对系统造成危害的能力。要启用此功能,请创建/etc/apt/apt.conf.d/40sandbox并添加:
APT::Sandbox::Seccomp "true";
请注意,全盘加密不包括/boot,这样仍然可以修改内核、引导加载程序和其他关键文件。为了完全防止篡改,您还必须实施经过验证的引导。
BIOS / UEFI强化
如果您仍在使用旧版BIOS,则应迁移到UEFI,以利用较新的安全功能。大多数BIOS或UEFI实现都支持设置密码。最好启用它并设置一个非常强壮的密码。虽然这是很弱的保护,因为重置密码很简单。它通常存储在易失性内存中,因此攻击者只需要能够卸下CMOS电池几秒钟,或者他们就可以使用某些主板上的跳线将其重置。
您还应该禁用所有未使用的设备和引导选项,例如USB引导,以减少攻击面。
别忽略BIOS或UEFI的更新,确保将其更新。将其与常规操作系统更新一样重要。
此外,请参阅《NSA的硬件和固件安全指南[6]》。
Bootloader密码
引导加载程序会在引导过程的早期执行,并负责加载操作系统。保护它非常重要,否则,它可能会被篡改。例如,本地攻击者可以通过在启动时使用init=/bin/bash作为内核参数来轻松获得root shell,该命令告诉内核执行/bin/bash而不是常规的init系统。您可以通过为引导加载程序设置密码来防止这种情况。仅设置引导程序密码不足以完全保护它。还必须按照以下说明设置经过验证的启动。
Grub
要为GRUB设置密码,请执行:
grub-mkpasswd-pbkdf2
set superusers="$username"
password_pbkdf2 $username $password
重新生成您的配置文件,GRUB现在将受到密码保护。
要仅限制编辑引导参数并访问GRUB控制台,同时仍然允许您引导,请编辑 /boot/grub/grub.cfg并在 “menuentry '$OSName' ”旁边添加“ --unrestricted”参数。
menuentry 'Arch Linux' --unrestricted
Syslinux
Syslinux可以设置主密码或菜单密码。引导任何条目都需要主密码,而引导特定条目仅需要菜单密码。
要为Syslinux设置主密码,请编辑/boot/syslinux/syslinux.cfg并添加:
MENU MASTER PASSWD $password
MENU PASSWD $password
这些密码可以是纯文本,也可以使用MD5,SHA-1,SHA-256或SHA-512进行散列。建议先使用强哈希算法(例如SHA-256或SHA-512)对密码进行哈希处理,以避免将其存储为明文形式。
systemd-boot
systemd-boot具有防止在引导时编辑内核参数的选项。在loader.conf文件中,添加:
editor no
验证引导
经过验证的引导通过密码验证来确保引导链和基本系统的完整性。这可用于确保物理攻击者无法修改设备上的软件。
如果没有经过验证的引导,则一旦获得物理访问权限,就可以轻松绕过上述所有预防措施。经过验证的引导不仅像许多人认为的那样是为了物理安全。它还可以用于防止远程恶意软件持久化——如果攻击者设法破坏了整个系统并获得了很高的特权,则经过验证的引导将在重新引导后还原其更改,并确保它们无法持久化。
经过验证的最常见的引导实现是UEFI安全引导,但是它本身并不是一个完整的实现,因为它仅会验证引导加载程序和内核,这意味着可以通过以下方法:
仅UEFI安全启动就没有一成不变的信任根,因此物理攻击者仍然可以刷新设备的固件。为了减轻这种情况,请结合使用UEFI安全启动和Intel Boot Guard或AMD Secure Boot。
远程攻击者(或不使用加密的物理攻击者)可以简单地修改操作系统的任何其他特权部分。例如,如果他们有修改内核的特权,那么他们也可以修改/sbin/init来有效地获得相同的结果。因此,仅验证内核和引导加载程序不会对远程攻击者产生任何影响。为了减轻这种情况,您必须使用dm-verity验证基本操作系统,尽管由于传统Linux发行版的布局,这非常困难且笨拙。
通常,很难在传统Linux上实现可靠的经过验证的引导实现。
USBs
USB设备为物理攻击提供了重要的攻击面。例如BadUSB和Stuxnet是此类攻击的范例。最佳实践是禁止所有新连接的USB且仅将受信任设备列入白名单,USBGuard对此非常有用。
您也可以将nousb用作内核引导参数,以禁用内核中的所有USB支持。可以sysctl设置kernel.deny_new_usb=1
DMA攻击
直接内存访问(DMA)攻击涉及通过插入某些物理设备来完全访问所有系统内存。这可以通过控制设备可访问的内存区域的IOMMU或将特别易受攻击的内核模块列入黑名单来缓解。
要启用IOMMU,请设置以下内核引导参数:
intel_iommu=on amd_iommu=on
efi=disable_early_pci_dma
此外,Thunderbolt和FireWire通常容易受到DMA攻击。要禁用它们,请将这些内核模块列入黑名单:
install firewire-core /bin/false
install thunderbolt /bin/false
冷启动攻击
当攻击者在擦除RAM中的数据之前对其进行分析时,就会发生冷启动攻击。使用现代RAM时,冷启动攻击不太实用,因为RAM通常会在几秒钟或几分钟内清除,除非将其放入冷却液(如液氮或冷冻机)中。攻击者必须在几秒钟内将设备中的RAM棒拔出并将其暴露于液氮中,而且确保用户不会注意到。
如果冷启动攻击是威胁模型的一部分,请在关机后保护计算机几分钟,以确保没有人可以访问您的RAM记忆棒。您也可以将RAM棒焊接到主板上,以使其更难以卡住。如果使用笔记本电脑,请取出电池,然后直接用充电电缆供电。关机后请拔出电缆,以确保RAM彻底断电无法访问。
在内核自我保护启动参数部分中,空闲时内存清零选项将用零覆盖内存中的敏感数据。此外,强化的内存分配器可以通过CONFIG_ZERO_ON_FREE配置选项清除用户空间堆内存中的敏感数据。尽管如此,某些数据仍可能保留在内存中。
此外,现代内核还包括复位攻击缓解措施,该命令可命令固件在关机时擦除数据,尽管这需要固件支持。
确保正常关闭计算机,以使上述缓解措施可以开始。
如果以上都不适用您的威胁模型,则可以实施Tails的内存擦除过程,该过程将擦除大部分内存(视频内存除外),并且已被证明是有效的。
禁用或删除不需要的东西以最小化攻击面。
保持更新。配置cron任务或init脚本以每天更新系统。
不要泄漏有关您或您的系统的任何信息,无论它看起来多么渺小。
遵循常规的安全和隐私建议
Arch Linux Security wiki page:https://wiki.archlinux.org/index.php/Security
Whonix Documentation:https://www.whonix.org/wiki/Documentation
NSA RHEL 5 Hardening Guide(稍有过时,但仍包含有用的信息):https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfm
KSPP recommended kernel settings:https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project/Recommended_Settings
kconfig-hardened-check:https://github.com/a13xp0p0v/kconfig-hardened-check/
grub-mkconfig -o $path_to_grub_config
另外,在Debian或Ubuntu等发行版上,您应该执行以下命令:
update-grub
相关链接:
https://github.com/Whonix/security-misc/blob/master/lib/systemd/system/hide-hardware-info.service
https://gitlab.com/apparmor/apparmor/-/wikis/Documentation
https://www.freedesktop.org/software/systemd/man/systemd.exec.html
https://lists.llvm.org/pipermail/cfe-dev/2020-April/065221.html
https://href.li/?https://linux.die.net/man/8/iptables
https://github.com/nsacyber/Hardware-and-Firmware-Security-Guidance
声明:本文部分素材转载自互联网,如有侵权立即删除 。
--END--
往日精彩:
166 个最常用的 Linux 命令汇总,总有你需要用到的!
喜欢本文的朋友们,欢迎长按二维码,关注订阅号Linux就该这样学
收看更多精彩内容